# -*- coding: utf-8 -*-
# @Organization  : asiainfo
# @Author        : 周伟东
# @Time          : 2021/1/7 16:39
# @Function      : 任务队列模块

import logging
import threading
from queue import Queue
from app.constants import TASK_QUEUE_SIZE, JOB_DELETED
from app.core.job_asset_one_service import jobAssetOneService
from app.core.job_asset_service import jobAssetService


class Consumer(threading.Thread):
    """
    消费者，用于消费任务队列
    """

    def __init__(self, queue, name):
        threading.Thread.__init__(self)
        self.queue = queue
        self.name = name

    def run(self):
        """
        不断循环从任务队列中，取出任务进行处理，没任务时进行阻塞
        """
        while True:
            # 此处可以考虑根据job_type 使用策略模式，完成任务
            job_id = self.queue.get()
            logging.info("从任务队列中取出一个任务.")
            from app.dao.job_dao import jobDao
            job = jobDao.find_job(job_id)
            if not job or job.is_deleted == JOB_DELETED:
                logging.info("该条任务不存在或者已经被删除:%s" % job_id)
            else:
                #jobAssetService.process(job)
                jobAssetOneService.process(job)


class JobQueue:
    """
    任务队列，且是一个阻塞队列
    单例模式
    """
    # 任务队列,阻塞队列
    queue = Queue(TASK_QUEUE_SIZE)

    # 添加任务
    def addJob(self, e):
        if self.queue.full():
            return False
        else:
            self.queue.put(e)
            return True

    # 创建一个消费者
    @property
    def consumer(self):
        return Consumer(self.queue, '消费者')


# 任务队列
jobQueue = JobQueue()
